package com.cskaoyan.javase.factorial2;

/**
 * @description: 通过算阶乘了解递归的思想
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 举一个简单阶乘案例
 * n! = n *(n-1)*(n-2)*...*2*1
 * n! = n * (n-1)!
 * (n-1)! = （n-1 )*(n-2)!
 * ....
 * 2! = 2 * 1!= 2
 * 1! = 1
 *
 * 计算阶乘能够特别好的体现递归的思想：
 * 1，把一个复杂的大问题，分解成若干个相似的子问题
 *  * 2，子问题还能够继续分解
 *  * 3，最终子问题分解的特别小，小到随便就能知道答案
 *  * 4，最后，把所有子问题的解合并起来，就是复杂大问题的解
 *
 *
 * 1，怎么写一个递归
 * 写递归，别的先不想，先想什么时候停下来，先想递归出口
 * 然后再写递归出口
 *
 * 递归的优点：能够把大问题分解成小问题，非常利于思考，往往代码也不复杂
 * 但是递归很危险，占用空间，效率也低
 * 正常情况不要使用
 *
 */

public class Demo {
    public static void main(String[] args) {
        System.out.println(factorial(5));
    }

    //使用递归求解阶乘
    public static int factorial(int n) {
        if (n == 1) {
            return 1;
        } else {
            return n * factorial(n - 1);
        }
    }
}
